home *** CD-ROM | disk | FTP | other *** search
/ 9-Digit Zip Code Directory / 9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO / z4src.zip / VARIANT.H < prev    next >
C/C++ Source or Header  |  1993-11-16  |  10KB  |  267 lines

  1. /*** 
  2. *variant.h
  3. *
  4. *  Copyright (C) 1992-1993, Microsoft Corporation.  All Rights Reserved.
  5. *
  6. *Purpose:
  7. *  This file declares VARIANT, and related data types.
  8. *
  9. *Implementation Notes:
  10. *  This file requires ole2.h
  11. *
  12. *****************************************************************************/
  13.  
  14. #ifndef _VARIANT_H_
  15. #define _VARIANT_H_
  16.  
  17.  
  18. #ifndef HUGEP
  19. # ifdef _MAC
  20. #  define HUGEP FAR
  21. # else
  22. #  if WIN32
  23. #   define HUGEP
  24. #  else
  25. #   define HUGEP _huge
  26. #  endif
  27. # endif
  28. #endif
  29.  
  30. #ifndef FAR
  31. # ifdef _MAC
  32. #  define FAR
  33. # else
  34. #  ifdef WIN32
  35. #   define FAR
  36. #  else
  37. #   define FAR _far
  38. #  endif
  39. # endif
  40. #endif
  41.  
  42.  
  43. /* Forward Declarations */
  44.  
  45. #ifdef __cplusplus
  46. interface IDispatch;
  47. #else
  48. typedef interface IDispatch IDispatch;
  49. #endif
  50.  
  51.  
  52. #if defined(WIN32) && defined(UNICODE) 
  53.  
  54.   typedef wchar_t FAR* BSTR;
  55.   typedef BSTR FAR* LPBSTR;
  56.  
  57. #else /* ANSI Version */
  58.  
  59.   typedef char FAR* BSTR;
  60.   typedef BSTR FAR* LPBSTR;
  61.   
  62.   #ifndef _TCHAR_DEFINED
  63.      typedef char TCHAR;
  64.   #endif
  65.  
  66. #endif
  67.  
  68.  
  69. typedef struct FARSTRUCT tagSAFEARRAYBOUND {
  70.     unsigned long cElements;
  71.     long lLbound;
  72. } SAFEARRAYBOUND, FAR* LPSAFEARRAYBOUND;
  73.  
  74. typedef struct FARSTRUCT tagSAFEARRAY {
  75.     unsigned short cDims;
  76.     unsigned short fFeatures;
  77.     unsigned short cbElements;
  78.     unsigned short cLocks;
  79. #ifdef _MAC
  80.     Handle handle;
  81. #else
  82.     unsigned long handle;
  83. #endif
  84.     void HUGEP* pvData;
  85.     SAFEARRAYBOUND rgsabound[1];
  86. } SAFEARRAY, FAR* LPSAFEARRAY;
  87.  
  88. #define FADF_AUTO       0x0001    /* array is allocated on the stack         */
  89. #define FADF_STATIC     0x0002    /* array is staticly allocated             */
  90. #define FADF_EMBEDDED   0x0004    /* array is embedded in a structure        */
  91. #define FADF_FIXEDSIZE  0x0010    /* array may not be resized or reallocated */
  92. #define FADF_BSTR       0x0100    /* an array of BSTRs                       */
  93. #define FADF_UNKNOWN    0x0200    /* an array of IUnknown*                   */
  94. #define FADF_DISPATCH   0x0400    /* an array of IDispatch*                  */
  95. #define FADF_VARIANT    0x0800    /* an array of VARIANTs                    */
  96. #define FADF_RESERVED   0xF0E8  /* bits reserved for future use            */
  97.  
  98.  
  99. /* 0 == FALSE, -1 == TRUE */
  100. typedef short VARIANT_BOOL;
  101.  
  102.  
  103. typedef double DATE;
  104.  
  105.  
  106. /* This is a helper struct for use in handling currency. */
  107. typedef struct FARSTRUCT tagCY {
  108. #ifdef _MAC
  109.     long      Hi;
  110.     unsigned long Lo;
  111. #else
  112.     unsigned long Lo;
  113.     long      Hi;
  114. #endif
  115. } CY;
  116.  
  117.  
  118. /*
  119.  * VARENUM usage key,
  120.  *
  121.  *   [V] - may appear in a VARIANT
  122.  *   [T] - may appear in a TYPEDESC
  123.  *   [P] - may appear in an OLE property set
  124.  *
  125.  */
  126. enum VARENUM
  127. {
  128.     VT_EMPTY           = 0,   /* [V]   [P]  nothing                     */
  129.     VT_NULL            = 1,   /* [V]        SQL style Null              */
  130.     VT_I2              = 2,   /* [V][T][P]  2 byte signed int           */
  131.     VT_I4              = 3,   /* [V][T][P]  4 byte signed int           */
  132.     VT_R4              = 4,   /* [V][T][P]  4 byte real                 */
  133.     VT_R8              = 5,   /* [V][T][P]  8 byte real                 */
  134.     VT_CY              = 6,   /* [V][T][P]  currency                    */
  135.     VT_DATE            = 7,   /* [V][T][P]  date                        */
  136.     VT_BSTR            = 8,   /* [V][T][P]  binary string               */
  137.     VT_DISPATCH        = 9,   /* [V][T]     IDispatch FAR*              */
  138.     VT_ERROR           = 10,  /* [V][T]     SCODE                       */
  139.     VT_BOOL            = 11,  /* [V][T][P]  True=-1, False=0            */
  140.     VT_VARIANT         = 12,  /* [V][T][P]  VARIANT FAR*                */
  141.     VT_UNKNOWN         = 13,  /* [V][T]     IUnknown FAR*               */
  142.  
  143.     VT_I1              = 16,  /*    [T]     signed char                 */
  144.     VT_UI1             = 17,  /*    [T]     unsigned char               */
  145.     VT_UI2             = 18,  /*    [T]     unsigned short              */
  146.     VT_UI4             = 19,  /*    [T]     unsigned short              */
  147.     VT_I8              = 20,  /*    [T][P]  signed 64-bit int           */
  148.     VT_UI8             = 21,  /*    [T]     unsigned 64-bit int         */
  149.     VT_INT             = 22,  /*    [T]     signed machine int          */
  150.     VT_UINT            = 23,  /*    [T]     unsigned machine int        */
  151.     VT_VOID            = 24,  /*    [T]     C style void                */
  152.     VT_HRESULT         = 25,  /*    [T]                                 */
  153.     VT_PTR             = 26,  /*    [T]     pointer type                */
  154.     VT_SAFEARRAY       = 27,  /*    [T]     (use VT_ARRAY in VARIANT)   */
  155.     VT_CARRAY          = 28,  /*    [T]     C style array               */
  156.     VT_USERDEFINED     = 29,  /*    [T]     user defined type            */
  157.     VT_LPSTR           = 30,  /*    [T][P]  null terminated string      */
  158.     VT_LPWSTR          = 31,  /*    [T][P]  wide null terminated string */
  159.  
  160.     VT_FILETIME        = 64,  /*       [P]  FILETIME                    */
  161.     VT_BLOB            = 65,  /*       [P]  Length prefixed bytes       */
  162.     VT_STREAM          = 66,  /*       [P]  Name of the stream follows  */
  163.     VT_STORAGE         = 67,  /*       [P]  Name of the storage follows */
  164.     VT_STREAMED_OBJECT = 68,  /*       [P]  Stream contains an object   */
  165.     VT_STORED_OBJECT   = 69,  /*       [P]  Storage contains an object  */
  166.     VT_BLOB_OBJECT     = 70,  /*       [P]  Blob contains an object     */
  167.     VT_CF              = 71,  /*       [P]  Clipboard format            */
  168.     VT_CLSID           = 72   /*       [P]  A Class ID                  */
  169. };
  170.  
  171. #define VT_VECTOR      0x1000 /*       [P]  simple counted array        */
  172. #define VT_ARRAY       0x2000 /* [V]        SAFEARRAY*                  */
  173. #define VT_BYREF       0x4000 /* [V]                                    */
  174. #define VT_RESERVED    0x8000
  175.  
  176.  
  177. typedef unsigned short VARTYPE;
  178.  
  179. typedef struct FARSTRUCT tagVARIANT VARIANT;
  180. typedef struct FARSTRUCT tagVARIANT FAR* LPVARIANT;
  181. typedef struct FARSTRUCT tagVARIANT VARIANTARG;
  182. typedef struct FARSTRUCT tagVARIANT FAR* LPVARIANTARG;
  183.  
  184. struct FARSTRUCT tagVARIANT{
  185.     VARTYPE vt;
  186.     unsigned short wReserved1;
  187.     unsigned short wReserved2;
  188.     unsigned short wReserved3;
  189.     union {
  190.       short       iVal;             /* VT_I2                */
  191.       long       lVal;             /* VT_I4                */
  192.       float       fltVal;           /* VT_R4                */
  193.       double       dblVal;           /* VT_R8                */
  194.       VARIANT_BOOL bool;             /* VT_BOOL              */
  195.       SCODE       scode;            /* VT_ERROR             */
  196.       CY       cyVal;            /* VT_CY                */
  197.       DATE       date;             /* VT_DATE              */
  198.       BSTR       bstrVal;          /* VT_BSTR              */
  199.       IUnknown       FAR* punkVal;     /* VT_UNKNOWN           */
  200.       IDispatch       FAR* pdispVal;    /* VT_DISPATCH          */
  201.       SAFEARRAY       FAR* parray;         /* VT_ARRAY|*           */
  202.  
  203.       short       FAR* piVal;       /* VT_BYREF|VT_I2         */
  204.       long       FAR* plVal;       /* VT_BYREF|VT_I4         */
  205.       float       FAR* pfltVal;     /* VT_BYREF|VT_R4       */
  206.       double       FAR* pdblVal;     /* VT_BYREF|VT_R8       */
  207.       VARIANT_BOOL FAR* pbool;       /* VT_BYREF|VT_BOOL     */
  208.       SCODE       FAR* pscode;      /* VT_BYREF|VT_ERROR    */
  209.       CY       FAR* pcyVal;      /* VT_BYREF|VT_CY       */
  210.       DATE       FAR* pdate;       /* VT_BYREF|VT_DATE     */
  211.       BSTR       FAR* pbstrVal;    /* VT_BYREF|VT_BSTR     */
  212.       IUnknown  FAR* FAR* ppunkVal;  /* VT_BYREF|VT_UNKNOWN  */
  213.       IDispatch FAR* FAR* ppdispVal; /* VT_BYREF|VT_DISPATCH */
  214.       SAFEARRAY FAR* FAR* pparray;   /* VT_BYREF|VT_ARRAY|*  */
  215.       VARIANT       FAR* pvarVal;     /* VT_BYREF|VT_VARIANT  */
  216.  
  217.       void       FAR* byref;         /* Generic ByRef        */
  218.     }
  219. #if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
  220.     u
  221. #endif
  222.     ;
  223. };
  224.  
  225. #if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
  226. # define V_UNION(X, Y) ((X)->u.Y)
  227. #else
  228. # define V_UNION(X, Y) ((X)->Y)
  229. #endif
  230.  
  231. /* Variant access macros */
  232. #define V_VT(X)          ((X)->vt)
  233. #define V_ISBYREF(X)     (V_VT(X)&VT_BYREF)
  234. #define V_ISARRAY(X)     (V_VT(X)&VT_ARRAY)
  235. #define V_ISVECTOR(X)    (V_VT(X)&VT_VECTOR)
  236.  
  237. #define V_NONE(X)        V_I2(X)
  238. #define V_I2(X)             V_UNION(X, iVal)
  239. #define V_I2REF(X)       V_UNION(X, piVal)
  240. #define V_I4(X)          V_UNION(X, lVal)
  241. #define V_I4REF(X)       V_UNION(X, plVal)
  242. #define V_R4(X)             V_UNION(X, fltVal)
  243. #define V_R4REF(X)       V_UNION(X, pfltVal)
  244. #define V_R8(X)             V_UNION(X, dblVal)
  245. #define V_R8REF(X)       V_UNION(X, pdblVal)
  246. #define V_BOOL(X)        V_UNION(X, bool)
  247. #define V_BOOLREF(X)     V_UNION(X, pbool)
  248. #define V_ERROR(X)       V_UNION(X, scode)
  249. #define V_ERRORREF(X)    V_UNION(X, pscode)
  250. #define V_CY(X)             V_UNION(X, cyVal)
  251. #define V_CYREF(X)       V_UNION(X, pcyVal)
  252. #define V_DATE(X)        V_UNION(X, date)
  253. #define V_DATEREF(X)     V_UNION(X, pdate)
  254. #define V_BSTR(X)        V_UNION(X, bstrVal)
  255. #define V_BSTRREF(X)     V_UNION(X, pbstrVal)
  256. #define V_UNKNOWN(X)     V_UNION(X, punkVal)
  257. #define V_UNKNOWNREF(X)  V_UNION(X, ppunkVal)
  258. #define V_DISPATCH(X)    V_UNION(X, pdispVal)
  259. #define V_DISPATCHREF(X) V_UNION(X, ppdispVal)
  260. #define V_VARIANTREF(X)  V_UNION(X, pvarVal)
  261. #define V_ARRAY(X)       V_UNION(X, parray)
  262. #define V_ARRAYREF(X)    V_UNION(X, pparray)
  263. #define V_BYREF(X)       V_UNION(X, byref)
  264.  
  265. #endif /* _VARIANT_H_ */
  266.  
  267.